/**
 * Created by zy on 2016/6/29.
 * 封装了 Dyy 常用工具对象和 DyyBase 数据配置对象
 */

/*** 全局工具集 不依赖任何js库文件 ***/
var Dyy = {
    // 检查日期格式
    checkDateFormat: function (d) {
        var reg = /^[0-9]{4}-[0-1]?[0-9]{1}-[0-3]?[0-9]{1}$/;
        return reg.test(d);
    },

    // 比较两个日期早晚
    checkDateLate: function(f,s){
        var end = new Date(s);
        var start = new Date(f);
        return (end >= start);
    },

    // 获取客户端浏览器cookie
    getCookie: function (c_name) {
        if (document.cookie.length > 0) {
            var c_start = document.cookie.indexOf(c_name + '=');
            if (c_start != -1) {
                c_start = c_start + c_name.length + 1;
                var c_end = document.cookie.indexOf(';', c_start);
                if (c_end == -1) c_end = document.cookie.length;
                return unescape(document.cookie.substring(c_start, c_end));
            }
        }
        return '';
    },

    // 设置客户端浏览器cookie
    setCookie: function (c_name, value, expiredays) {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + expiredays);
        document.cookie = c_name + '=' + escape(value) + ((expiredays == null) ? '' : ';expires=' + exdate.toGMTString() + ';path=/');
    },

    // 清除指定客户端浏览器cookie
    delCookie: function (c_name) {
        var exp = new Date();
        exp.setTime(exp.getTime() - 1);
        var cval = Dyy.getCookie(c_name);
        if (cval != null) {
            document.cookie = c_name + '=' + cval + ';expires=' + exp.toGMTString();
        }
    },

    // 转义特殊字符为html实体
    htmlEncode: function(str){
        if(str && str.length > 0){
            var s;
            s = str.replace(/&/ig, '&amp;');
            s = s.replace(/</ig, '&lt;');
            s = s.replace(/>/ig, '&gt;');
            s = s.replace(/ /ig, '&nbsp;');
            s = s.replace(/\'/ig, '&#39;');
            s = s.replace(/\"/ig, '&quot;');
            s = s.replace(/\n/ig, '<br>');
            return s;
        }
        return '';
    },

    // 将html实体转义为字符
    htmlDecode: function(str){
        if(str && str.length > 0){
            var s;
            s = str.replace(/&amp;/ig, '&');
            s = s.replace(/&lt;/ig, '<');
            s = s.replace(/&gt;/ig, '>');
            s = s.replace(/&nbsp;/ig, ' ');
            s = s.replace(/&#39;/ig, '\'');
            s = s.replace(/&quot;/ig, '\"');
            s = s.replace(/<br>/ig, '\n');
            return s;
        }
        return '';
    },

    // 清除左空格/右空格
    ltrim: function (s) {
        return s.replace(/^(\s*|　*)/, '');
    },
    rtrim: function (s) {
        return s.replace(/(\s*|　*)$/, '');
    },

    // 清除左右空格
    trim: function (s) {
        return this.ltrim(this.rtrim(s));
    },

    // 去除 时间 时分秒
    getDate: function (d, tag) {
        if (d == null || d == undefined || d === '' || d === ' ') {
            if (tag) {
                return '';
            } else {
                return '-';
            }
        } else {
            return d.substring(0, 10);
        }
    },

    /**
     * v - 传入值, 可能来自 input,select,textarea,checkbox,radio
     * t - 要检验值类型，包括基本 number,regexp,
     * r - 正则表达式
     * null,undefined,'', 返回 空字符''
     * 合法 返回 其本身
     */
    chkValue: function (v, t, r) {
        if (v != undefined || v != null || v != 'undefined' || v != 'null' || v != '') {
            v = this.trim(v);
            if (t === 'number' && !isNaN(v)) {
                return v;
            }
            if (t === 'regexp') {
                return r.test(v);
            }
            v = this.htmlEncode(v);
            return v;
        } else {
            return false;
        }
    },

    /**
     * 设置本地存储
     */
    setStorage: function (k, v) {
        if (window.sessionStorage) {
            window.sessionStorage.setItem(k, v);
        }
    },

    /**
     * 获取本地存储
     */
    getStorage: function (k) {
        if (window.sessionStorage) {
            return window.sessionStorage.getItem(k);
        }
    },

    /**
     * 删除指定本地存储
     */
    deleteStorage: function (k) {
        if (window.sessionStorage) {
            return window.sessionStorage.removeItem(k);
        }
    },

    /**
     * 删除所有本地存储
     */
    clearStorage: function () {
        if (window.sessionStorage) {
            window.sessionStorage.clear();
        }
    }
};

/*** 全局配置数据 ***/
var DyyBase = function () {

    // 返回此对象
    var base = {};

    // 当前项目路径
    base.root_path = function () {
        return $('#JQ_root_path').attr('content');
    }();
    // 当前token
    base._token = function () {
        return $('#JQ_token').attr('content');
    }();
    // 当前文件路径
    base.file_path = function () {
        return $('#JQ_file_path').attr('content');
    }();
    // 是否启用搜索条件 - 默认为false;
    base.search = false;
    // 当前主菜单ID
    base.mid = function () {
        return $('#JQ_menu_mark').attr('content');
    }();

    // 管体缺陷表格无数据显示html内容
    base.defect_empty = function (title, meta) {
        var t = title || '管道管理的太好了!';
        var m = meta || '未发现其它管体缺陷。';
        return '<div class="zy-datatable-empty"><p><img src="' + base.root_path + '/static/img/no_data.png"></p><h2>' + t + '</h2><p class="c-90">' + m + '</p></div>';
    };

    // 所有表格无数据项时显示html内容
    base.table_empty = function () {
        return '<div class="zy-datatable-empty"><p><img src="' + base.root_path + '/static/img/chart_no_data.png"></p></div>';
    };

    /*** 接口地址 - start ***/
    // 管体缺陷仪表板 - 管道
    base.url_piping = function () {
        return base.root_path + '/comm/getLine.json';
    };
    // 根据管道id获取检测任务
    base.url_piping_task = function () {
        return base.root_path + '/comm/taskByLineId.json';
    };
    // 保存缺陷类型-步骤1
    base.url_defect_save_1 = function () {
        return base.root_path + '/pbf/RepairTask/createOrUpdate1.json';
    };
    // 保存缺陷类型-步骤2
    base.url_defect_save_2 = function () {
        return base.root_path + '/pbf/RepairTask/createOrUpdate2.json';
    };
    // 缺陷维修管理 - 列表
    base.url_repair_list = function () {
        return base.root_path + '/pbf/RepairTask/queryRepairTaskList.json';
    };
    // 缺陷维修管理 - 发布
    base.url_repair_release = function () {
        return base.root_path + '/pbf/RepairTask/updateDataState.json';
    };
    // 缺陷维修管理 - 删除
    base.url_repair_delete = function () {
        return base.root_path + '/pbf/RepairTask/updateToDelete.json';
    };
    // 缺陷维修管理 - 关闭
    base.url_repair_close = function () {
        return base.root_path + '/pbf/RepairTask/updateRepairTaskStated.json';
    };
    // 缺陷维修管理 - 导出
    base.url_repair_export = function () {
        return base.root_path + '/pbf/RepairTask/toExcel.json';
    };
    // 缺陷维修管理 - 详情 - 页面
    base.url_repair_details_page = function () {
        return base.root_path + '/pbf/RepairTask/initDetail.html';
    };
    // 缺陷维修管理 - 详情 - 地图 - 查询一个缺陷点附件的定位信息
    base.url_repair_location_map_query = function () {
        return base.root_path + '/pbf/RepairTask/queryNearbyLocationByMileage.json'
    };
    // 缺陷维修管理 - 详情 - 地图 - 条件查询地图
    base.url_repair_location_map_task = function () {
        return base.root_path + '/pbf/RepairTask/queryRepairTaskGISID.json';
    };
    // 缺陷类型
    base.url_defect_stype = function () {
        return base.root_path + '/comm/getCode.json?majorCode=TDF_FEATURE_TYPE&level=1';
    };
    // 缺陷子类型
    base.url_defect_subtype = function () {
        return base.root_path + '/comm/getCodeByParentId.json?majorCode=TDF_FEATURE_TYPE';
    };
    // 非内检缺陷管理 - 审核
    base.url_auditing = function () {
        return base.root_path + '/pbf/external/auditing.json';
    };
    // 非内检缺陷管理 - 去审核
    base.url_auditing_go = function () {
        return base.root_path + '/pbf/external/auditing.html';
    };
    // 非内检缺陷管理 - 创建(添加)
    base.url_noninternal_create = function () {
        return base.root_path + '/pbf/external/create.json';
    };
    // 非内检缺陷管理 - 统计 - 中转
    base.url_noninternal_statistics = function () {
        return base.root_path + '/pbf/external/statistics.json';
    };
    // 非内检缺陷管理 - 统计 - 跳转
    base.url_noninternal_statistics_mid = function () {
        return base.root_path + '/pbf/external/statistics.html';
    };
    // 非内检缺陷管理 - 防腐层修复 - 是否为补口
    base.url_noninternal_repair_isjoint = function () {
        return base.root_path + '/comm/getCode.json?majorCode=TDF_IS_JOINT&level=1';
    };
    // 非内检缺陷管理 - 防腐层修复 -修复材料
    base.url_noninternal_repair_coat_material = function () {
        return base.root_path + '/comm/getCode.json?majorCode=TDF_REPAIR_MATERIAL&level=1';
    };
    // 非内检缺陷管理 - 防腐层修复 - 保存
    base.url_noninternal_repair_coat_save = function () {
        return base.root_path + '/pbf/externalRepair/repairCoatCreate.json';
    };
    // 非内检缺陷管理 - 复合材料补强修复 - 修复方法
    base.url_noninternal_repair_composites_method = function () {
        return base.root_path + '/comm/getCode.json?majorCode=TDF_COMPOSITES_REPAIR_METHOD&level=1';
    };
    // 非内检缺陷管理 - 复合材料补强修复 - 修复材料
    base.url_noninternal_repair_composites_material = function () {
        return base.root_path + '/comm/getCode.json?majorCode=TDF_COMPOSITES_REPAIR_MATERIAL&level=1';
    };
    // 非内检缺陷管理 - 复合材料补强修复 - 保存
    base.url_noninternal_repair_composites_save = function () {
        return base.root_path + '/pbf/externalRepair/repairCompositesCreate.json';
    };
    // 非内检缺陷管理 - 钢质环氧套筒补强修复 - 套筒结构
    base.url_noninternal_repair_socket_structure = function () {
        return base.root_path + '/comm/getCode.json?majorCode=TDF_SOCKET_STRUCTURE&level=1';
    };
    // 非内检缺陷管理 - 钢质环氧套筒补强修复 - 材质A
    base.url_noninternal_repair_material_a = function () {
        return base.root_path + '/comm/getCode.json?majorCode=MATERIAL&level=1';
    };
    // 非内检缺陷管理 - 钢质环氧套筒补强修复 - 材质B
    base.url_noninternal_repair_material_b = function () {
        return base.root_path + '/pbf/externalRepair/getMaterialB.json';
    };
    // 非内检缺陷管理 - 钢质环氧套筒补强修复 - 保存
    base.url_noninternal_repair_sleeve_save = function () {
        return base.root_path + '/pbf/externalRepair/repairEpoxySleeveCreate.json';
    };
    // 非内检缺陷管理 - AB型套筒补强修复 - 保存
    base.url_noninternal_repair_abtype_save = function () {
        return base.root_path + '/pbf/externalRepair/repairABTypeSleeveCreate.json';
    };
    // 非内检缺陷管理 - 其他修复 - 保存
    base.url_noninternal_repair_other_save = function () {
        return base.root_path + '/pbf/externalRepair/repairOtherCreate.json';
    };
    // 非内检缺陷管理 - 换管 - 制管方式
    base.url_noninternal_repair_replace_manupipe = function () {
        return base.root_path + '/comm/getCode.json?majorCode=MANUPIPE_TYPE&level=1';
    };
    // 非内检缺陷管理 - 换管 - 管径
    base.url_noninternal_repair_replace_diameter = function () {
        return base.root_path + '/comm/getCode.json?majorCode=DIAMETER&level=1';
    };
    // 非内检缺陷管理 - 换管 - 防腐层材料
    base.url_noninternal_repair_replace_coat_material = function () {
        return base.root_path + '/comm/getCode.json?majorCode=COATINGMATERIAL&level=1';
    };
    // 非内检缺陷管理 - 换管 - 防腐等级
    base.url_noninternal_repair_replace_coat_grade = function () {
        return base.root_path + '/comm/getCode.json?majorCode=COATING_GRADE&level=1';
    };
    // 非内检缺陷管理 - 换管 - 保存
    base.url_noninternal_repair_replace_save = function () {
        return base.root_path + '/pbf/externalRepair/repairReplacePipeCreate.json';
    };
    // 非内检缺陷管理 - 换管 - 焊接 - 无损检测类型
    base.url_noninternal_repair_ndt_type = function () {
        return base.root_path + '/comm/getCode.json?majorCode=NDT_TYPE&level=1';
    };
    // 非内检缺陷管理 - 点击详情 - 获取图片
    base.url_noninternal_repair_details_imgs = function () {
        return base.root_path + '/pbf/external/queryImage.json';
    };
    // 非内检缺陷管理 - 新建 - 获得gisid
    base.url_noninternal_get_gisid = function () {
        return base.root_path + '/pbf/external/getLineGisId.json';
    };
    // 非内检缺陷管理 - 删除缺陷报告
    base.url_noninternal_delete_upload_file = function () {
        return base.root_path + '/pbf/external/delectReport.json';
    };
    // 非内检缺陷管理 - 删除上传照片
    base.url_noninternal_delete_upload_img = function () {
        return base.root_path + '/comm/deleteAttachment.json';
    };


    // 上传文件
    base.url_upload_file = function(){ return base.root_path + '/comm/UploadFile.json?AjaxMode=true&random='+Math.random(); };
    // 下载文件
    base.url_download_file = function(){ return base.root_path + '/comm/downFiles.json?AjaxMode=true&random='+Math.random(); };
    // 主菜单
    base.url_main_menu = function(){ return base.root_path + '/menu/menuList.json'; };
    // 主页动态
    base.url_homepage_news = function(){ return base.root_path + '/getUserMsg.json'; };
    // 根据管道查询管段
    base.url_segment = function(){ return base.root_path + '/comm/queryPipeSegment.json'; };
    // 根据管道、管段、输入名称查询桩或者阀室
    base.url_sign = function(){ return base.root_path + '/comm/queryPipeSign.json'; };
    // 根据管道查询管道起止点
    base.url_pipe_pos = function(){ return base.root_path + '/comm/queryPipeLineById.json'; };
    // 根据管段查询管段起止点
    base.url_segment_pos = function(){ return base.root_path + '/comm/queryPipeSegmentById.json'; };
    // 修复建议
    base.url_repair_suggestion = function(){ return base.root_path + '/comm/getCode.json?majorCode=REPAIR_SUGGESTED&level=1'; };
    /*** 接口地址 - end ***/

    /*** 工具 - 默认为私有方法 - start ***/

    /**
     * 通用方法 - 将数组1内匹配数组2的元素删除
     * @param array1
     * @param array2
     * @returns {*}
     */
    function deleteArray(arr1,arr2){
        // 注意此处是 ascii 排序,如不这样会引起bug
        // 或许有其他更好的办法,暂时没想到
        arr1.sort();
        arr2.sort();
        for(var i = 0, len = arr1.length; i < len; i++){
            for(var j = 0, lens = arr2.length; j < lens; j++){
                if(arr1[i] === arr2[j]){
                    arr1.splice(i,1);
                }
            }
        }
        return arr1;
    }

    /**
     * 清管管理 - 获取图片的path值
     * @returns {*}
     */
    function getImagePath(data){
        if(data.length > 0){
            var arr = [];
            for(var i=0;i<data.length;i++){
                if(data[i].path != '' && data[i].path != undefined && data[i].path != null){
                    var x = {id:data[i].id,path:base.file_path+data[i].path};
                    arr.push(x);
                }else{
                    var curId = '00' + i;
                    arr.push({id:curId,path:base.file_path+data[i]});
                }
            }
            return arr;
        }else{
            var nullArr = [];
            return nullArr;
        }

    }

    /**
     * 获取当前日期
     * 返回值格式为YYYY-MM-DD
     */
    function currentData(){
        var newData = new Date();
        var yearVal = newData.getFullYear();
        var moVal = newData.getMonth();
        var monVal = parseInt(moVal) + 1;
        var dateVal = newData.getDate();
        var mVal='',dVal='',curData;
        if(monVal<10){
            mVal = '0' + monVal;
        }else if(monVal>=10){
            mVal = monVal;
        }
        if(dateVal<10){
            dVal = '0' + dateVal;
        }else{
            dVal = dateVal;
        }
        curData = yearVal + '-' + mVal + '-' + dVal;

        return curData;
    }


    /**
     * 获取下拉框对应的数据，封装好方便使用select3展示
     * @param key
     * @param type 0 查询省，1查询市，2查询地区
     * @returns {Array}
     */
     function getSelectData(key, type, t) {
        var data = cityArr();
        var d = data[key];
        var arr = [];
        var str = '省';
        switch(type) {
            case 1 : str = '市';break;
            case 2 : str = '地区';break;
            default : str = '省';
        }
        if(t){
            arr.push({id: -1, text : '请选择' + str});
        }
        for (var x in d) {
            arr.push({id: x, text : d[x]})
        }
        return arr;
    }

    /**
     * 通用方法 - 获得下拉列表数据
     * 应用: 将其数据封装成 id,text,mile 对象数组,为下拉框提供数据
     * @param data      原始数据集,通常来自 ajax 请求
     * @param flag      mile 类型 true 为小数,否则整数(默认)
     * @returns {Array} 返回结果数组
     */
    function getSelect(data,flag){
        var arr = [], temp = [];
        if($.isArray(data)){
            temp = data;
        }
        if($.isPlainObject(data)){
            if(data.hasOwnProperty('result')){
                if($.isArray(data['result'])){
                    temp = data['result'];
                }
                if(data['result'].hasOwnProperty('list')){
                    if($.isArray(data['result']['list'])){
                        temp = data['result']['list'];
                    }
                }
            }
        }
        var len = temp.length;
        if(len){
            for(var i = 0; i < len; i++){
                var obj;
                var row = temp[i];
                if($.isPlainObject(row)){
                    obj = {};
                    obj.id = function(){
                        var id = '';
                        if(row.hasOwnProperty('id')){
                            id = row['id'];
                        }
                        if(row.hasOwnProperty('ID')){
                            id = row['ID'];
                        }
                        return id;
                    }();
                    obj.text = function(){
                        var name = '';
                        if(row.hasOwnProperty('name')){
                            name = row['name'];
                        }
                        if(row.hasOwnProperty('NAME')){
                            name = row['NAME'];
                        }
                        return name;
                    }();
                    obj.mile = function(){
                        var mile = '';
                        if(row.hasOwnProperty('mileage') && row.hasOwnProperty('mileage2')){
                            if(flag){
                                mile = row['mileage'];
                            }else{
                                mile = row['mileage2'];
                            }
                        }
                        return mile;
                    }();
                }
                if(obj){
                    arr.push(obj);
                }
            }
        }
        return arr;
    }

    /**
     * 通用方法 - 获得起点位置或终点位置数据
     * 应用: 将其数据封装成 id,text,mile 对象数组,为下拉框提供数据
     * @param data      原始数据集,通常来自 ajax 请求
     * @param tag       起点(begin) 或 终点(end) 标记
     * @param flag      mile 类型 true 为小数,否则整数(默认)
     * @returns {Array} 返回结果数组
     */
    function getPos(data,tag,flag) {
        var arr = [], obj;
        if($.isPlainObject(data)){
            if(data.hasOwnProperty('result')){
                if($.isPlainObject(data['result'])){
                    obj = {};
                    if(tag === 'begin'){
                        obj.id = function(){
                            var id = '';
                            if(data['result'].hasOwnProperty('beginId')){
                                id = data['result']['beginId'];
                            }
                            return id;
                        }();
                        obj.text = function(){
                            var name = '';
                            if(data['result'].hasOwnProperty('beginName')){
                                name = data['result']['beginName'];
                            }
                            return name;
                        }();
                        obj.mile = function(){
                            var mile = '';
                            if(flag){
                                if(data['result'].hasOwnProperty('beginMileage')){
                                    mile = data['result']['beginMileage'];
                                }
                            }else{
                                if(data['result'].hasOwnProperty('beginMileage2')){
                                    mile = data['result']['beginMileage2'];
                                }
                            }
                            return mile;
                        }();
                    }
                    if(tag === 'end'){
                        obj.id = function(){
                            var id = '';
                            if(data['result'].hasOwnProperty('endId')){
                                id = data['result']['endId'];
                            }
                            return id;
                        }();
                        obj.text = function(){
                            var name = '';
                            if(data['result'].hasOwnProperty('endName')){
                                name = data['result']['endName'];
                            }
                            return name;
                        }();
                        obj.mile = function(){
                            var mile = '';
                            if(flag){
                                if(data['result'].hasOwnProperty('endMileage')){
                                    mile = data['result']['endMileage'];
                                }
                            }else{
                                if(data['result'].hasOwnProperty('endMileage2')){
                                    mile = data['result']['endMileage2'];
                                }
                            }
                            return mile;
                        }();
                    }
                }
            }
        }
        if(obj){
            arr.push(obj);
        }
        return arr;
    }

    function getNewPos(data,tag,flag) {
        var arr = [], obj;
        if($.isPlainObject(data)){
            if(data.hasOwnProperty('pipePosition')){
                if($.isPlainObject(data['pipePosition'])){
                    obj = {};
                    if(tag === 'begin'){
                        obj.id = function(){
                            var id = '';
                            if(data['pipePosition'].hasOwnProperty('beginId')){
                                id = data['pipePosition']['beginId'];
                            }
                            return id;
                        }();
                        obj.text = function(){
                            var name = '';
                            if(data['pipePosition'].hasOwnProperty('beginName')){
                                name = data['pipePosition']['beginName'];
                            }
                            return name;
                        }();
                        obj.mile = function(){
                            var mile = '';
                            if(flag){
                                if(data['pipePosition'].hasOwnProperty('beginBallMileage')){
                                    mile = data['pipePosition']['beginBallMileage'];
                                }
                            }else{
                                if(data['pipePosition'].hasOwnProperty('beginBallMileage2')){
                                    mile = data['pipePosition']['beginBallMileage2'];
                                }
                            }
                            return mile;
                        }();
                    }
                    if(tag === 'end'){
                        obj.id = function(){
                            var id = '';
                            if(data['pipePosition'].hasOwnProperty('endId')){
                                id = data['pipePosition']['endId'];
                            }
                            return id;
                        }();
                        obj.text = function(){
                            var name = '';
                            if(data['pipePosition'].hasOwnProperty('endName')){
                                name = data['pipePosition']['endName'];
                            }
                            return name;
                        }();
                        obj.mile = function(){
                            var mile = '';
                            if(flag){
                                if(data['pipePosition'].hasOwnProperty('endBallMileage')){
                                    mile = data['pipePosition']['endBallMileage'];
                                }
                            }else{
                                if(data['pipePosition'].hasOwnProperty('endBallMileage2')){
                                    mile = data['pipePosition']['endBallMileage2'];
                                }
                            }
                            return mile;
                        }();
                    }
                }
            }
        }
        if(obj){
            arr.push(obj);
        }
        return arr;
    }
    // 如传入一个变量则必须是一个数组，否则返回一个空数组
    function needArr(a){
        try{
            if(a){
                if(a instanceof Array){
                    if(a.length > 0){
                        return a;
                    }
                }
            }
        }catch(e){
            alert(e);
            return [];
        }
        return [];
    }
    // 判断是否有数据，如服务器无任何返回 或 返回错误的Json
    function existJson(d){
        var temp_data = '';
        try{
            if(d.length > 0){
                temp_data = $.parseJSON(d);
            }else{
                showError('没有可用的数据源！<br>您可以联系管理员解决此问题。');
            }
        }catch(e){
            showError('数据源格式错误！<br>您可以联系管理员解决此问题。');
        }
        return temp_data;
    }
    // 判断是否有response，如服务器已返回正确Json，则返回Json
    function existResponse(d){
        var temp_data= '';
        try{
            if(d){
                temp_data = $.parseJSON(d);
            }else{
                showError('没有可用的数据源！<br>您可以联系管理员解决此问题。');
            }
        }catch(e){
            showError('数据源格式错误！<br>您可以联系管理员解决此问题。');
        }
        return temp_data;
    }
    // 提示程序出错-包括 ajax,form操作
    function showError(m){
        var $box = $('div.zy-error-box');
        var $body = $box.find('div.zy-error-body');
        var $btn = $box.find('span.zy-error-btn');
        $btn.click(function () {
            $box.animate({
                top: -400
            }, 'fast');
        });
        $body.empty().html(m);
        $box.stop().animate({
            top: 150
        },'fast');
        function hide(){
            $box.stop().animate({
                top: -400
            },'fast');
        }
        setTimeout(hide, 3500);
    }
    // 加载条 - 显示(true) - 隐藏(false)
    function playLoading(a){
        if(a === true){
            $('.zy-ajax-loading').stop().show('fast');
        }else if(a === false){
            $('.zy-ajax-loading').stop().hide('fast');
        }
    }
    // 页面重新加载
    function pageReload(){
        document.location.reload();
    }
    // 将对象属性为null转化为 0 用来计算
    function clearNaN(o){
        if(Object.prototype.toString.call(o) === '[object Object]'){
            for(var i in o){
                if(o[i] === null){
                    o[i] = 0;
                }
            }
            return o;
        }
        if(o === undefined || o === null){
            return 0;
        }
        return o;
    }
    // 将对象属性为null或''或undefined转化为'-'占位
    function clearNull(o){
        if(Object.prototype.toString.call(o) == '[object Object]'){
            for(var i in o){
                if(Object.prototype.toString.call(o[i]) == '[object Object]'){
                    base.clearNull(o[i]);
                }else{
                    if(o[i] === null || o[i] === '' || o[i] === undefined || o[i] === 'null' || o[i] === 'undefined'){
                        o[i] = '-';
                    }
                }
            }
            return o;
        }
        if(Object.prototype.toString.call(o) === '[object Array]'){
            for(var j = 0, len = o.length; j < len; j++){
                if(Object.prototype.toString.call(o[j]) === '[object Object]'){
                    base.clearNull(o[j]);
                }
            }
            return o;
        }
    }
    // 将对象属性为null或''或undefined转化为''占位
    function clearSpace(o){
        if(Object.prototype.toString.call(o) == '[object Object]'){
            for(var i in o){
                if(o[i] === null || o[i] === '' || o[i] === undefined || o[i] === 'null' || o[i] === 'undefined'){
                    o[i] = ' ';
                }
            }
            return o;
        }
        if(Object.prototype.toString.call(o) == '[object Array]'){
            for(var j = 0, len = o.length; j < len; j++){
                if(Object.prototype.toString.call(o[j]) == '[object Object]'){
                    for(var k in o[j]){
                        if(o[j][k] === null || o[j][k] === '' || o[j][k] === undefined || o[j][k] === 'null' || o[j][k] === 'undefined'){
                            o[j][k] = ' ';
                        }
                    }
                }
            }
            return o;
        }
    }
    // 返回前一个页面
    function goBackPage(v){
        if(v){
            window.history.go(v);
        }else{
            window.history.go(-1);
        }
    }
    // 跳转到一个页面 - 需要一个url
    function goToPage(u){
        if(u){
            window.location.href = u;
        }
    }
    // 跳转到登录页面 - user session 过期
    function goLogin(){
        window.location.href = base.root_path + '/login.html';
    }
    // 将一个对象转化为键值对数组 - name - value
    function convertToArr(o){
        var arr = [];
        for(var i in o){
            if(o[i] instanceof Array){
                if(o[i].length > 0){
                    for(var j = 0, len = o[i].length; j < len; j++){
                        arr.push({name:i,value:o[i][j]});
                    }
                }else{
                    arr.push({name:i,value:''});
                }
            }else{
                arr.push({name:i,value:o[i]});
            }
        }
        return arr;
    }

    /**
     * 取绝对距离的最大值，最小值
     * 只为完整性分析服务
     * @param a
     * @param b
     * @returns {{min: number, max: number}}
     */
    function getMinMax(a,b){
        var obj = {
            min: 0,
            max: 0
        };

        a = parseFloat(a) > 0 ? parseFloat(a) : 0;
        a = (a > 0 && a < 1) ? 0 : a;

        b = parseFloat(b) > 0 ? parseFloat(b) : 0;
        b = parseInt(b) + 1;

        obj.min = a;
        obj.max = b;

        return obj;
    }


    /**
     * 计算两个数百分比 (b - a) / a * 100.00
     * @param a
     * @param b
     * @returns {number}
     */
    function getPercent(a,b){
        var temp = 0;
        a = parseFloat(a);
        b = parseFloat(b);
        if(a === 0){
            return temp;
        }
        temp = (b - a)/a * 100.00;
        return parseInt(temp);
    }


    /**
     * 判断一个参数是否为空值
     * @param s 字符串
     * @returns {boolean}
     */
    function notEmpty(s){
        return s !== undefined && s !== null && s !== '' && s !== ' ';
    }


    /**
     * 对传输的url中文参数进行unicode编码
     * @param s
     * @returns {string}
     */
    function unicodeUrl(s){
        var ustr = '';
        for(var i = 0, len = s.length; i < len; i++){
            //var char = s.charAt(i);
            var code = s.charCodeAt(i);
            var code16 = code.toString(16);
            code16 = code16.length === 4 ? code16 : '00' + code16;
            var str = '\\u' + code16;
            ustr += str;
        }
        return ustr;
    }

    /**
     * 计算 charts-body 高宽
     * 此方法拷贝自 ui-main.js
     * 为被隐藏起来的 charts-box 再计算高宽
     */
    function setChartWidth(){
        var $box = $('div.zy-charts-box');
        if($box.length > 0){
            $box.each(function(){
                var $this = $(this);
                var w = $this.width(), h = $this.height();
                w = w - 2 - 30;
                h = h - 2 - 30 - 22;
                var $body = $this.find('div.zy-charts-body');
                if($body.length > 0){
                    $body.css({
                        'width': w,
                        'height': h
                    });
                }
                var empty = $body.attr('data-empty');
                var content = $body.html();
                if(!content){
                    $body.html('<img src="'+empty+'">');
                }
            });
        }
    }

    /**
     * 显示详情 - 应用于数据列表行详情展示
     * @param tag           当前触发 JQ 对象 通常情况下为展开详情 i 按钮
     * @param dtTable       DataTable 对象
     * @param table         JQ 数据表格
     * @param template      详情模板对象
     * @param list          提供现成的数据对象(注意这里可以为单个对象也可为数组)
     * @param cols          提供现成的列数目
     */
    function showDetails(tag,dtTable,table,template,list,cols){
        // 当前目标携带 id
        var id = tag.attr('data-id');
        // 是否存在已被填充 tr
        var $exist_tr = table.find('tr[data-id="'+id+'"]');
        // 隐藏其他行 tr i
        table.find('tr.zy-dy-tr').hide();
        table.find('i').removeClass('active');
        if($exist_tr.length > 0){
            tag.addClass('active');
            $exist_tr.show();
        }else{
            tag.addClass('active');

            // 父级数据行tr
            var $parent_tr = tag.parent('td').parent('tr');

            // 父级tr td数目
            var col = cols ? cols : $parent_tr.find('td').length;

            // 当前行数据
            var data = null;
            if(list){
                data = list;
            }else{
                data = dtTable.row($parent_tr).data();
            }

            // 构建显示行
            var $tr = $('<tr class="zy-dy-tr" data-id="'+id+'"><td colspan="'+col+'"><div class="zy-details-box"></div></td></tr>');
            var $div_box = $tr.find('div.zy-details-box');
            var $div_inner = $('<div class="zy-dy-inner"><div class="zy-dy-p"></div><div class="zy-dy-footer"></div></div>');
            var $div_body = $div_inner.find('div.zy-dy-p');
            var $div_foot = $div_inner.find('div.zy-dy-footer');

            // 收起按钮
            var $pick_btn = $('<button type="button" class="zy-button zy-pick-up" data-id="'+id+'"><i></i>收起</button>');
            $pick_btn.click(function(){
                var $this = $(this);
                var id = $this.attr('data-id');
                var $exist_tr = table.find('tr[data-id="'+id+'"]');
                if($exist_tr.length > 0){
                    tag.removeClass('active');
                    $exist_tr.hide();
                }
            });

            if($.isEmptyObject(data)){
                // 数据为空时
                $tr.find('td').empty().append(base.table_empty());
            }else{
                // 当数据为多条时
                if($.isArray(data)){
                    for(var n = 0, len_n = data.length; n < len_n; n++){
                        var d = data[n];
                        var row = '', cln = '';
                        for(var m = 0, len_m = template.length; m < len_m; m++){
                            if(d.hasOwnProperty(template[m]['name'])){
                                var ti = template[m]['title'];
                                var na = d[template[m]['name']];
                                if(template[m]['render'] && template[m]['render'] instanceof Function){
                                    na = template[m]['render'](na,d);
                                }
                                if(m == len_m - 1){
                                    cln += '<p title="'+ ti + na +'">'+ ti +'<span>'+ na +'</span></p><div class="clear"></div>';
                                }else{
                                    cln += '<p title="'+ ti + na +'">'+ ti +'<span>'+ na +'</span></p>';
                                }
                            }
                        }
                        if(n == len_n - 1){
                            row = '<blockquote class="n-b-b">' + cln + '</blockquote>';
                        }else{
                            row = '<blockquote>' + cln + '</blockquote>';
                        }
                        $div_body.append(row);
                    }
                }else if($.isPlainObject(data)){
                    var p = '';
                    for(var i = 0, len = template.length; i < len; i++){
                        if(data.hasOwnProperty(template[i]['name'])){
                            var key = template[i]['title'];
                            var value = data[template[i]['name']];
                            var node = '';
                            if(template[i]['render'] && template[i]['render'] instanceof Function){
                                value = template[i]['render'](value,data);
                            }
                            if(template[i]['node'] && template[i]['node'] instanceof Array){
                                for(var j = 0, lenth = template[i]['node'].length; j < lenth; j++){
                                    var name = data[template[i]['node'][j]['name']];
                                    var title = template[i]['node'][j]['title'];
                                    if(template[i]['node'][j]['render'] && template[i]['node'][j]['render'] instanceof Function){
                                        name = template[i]['node'][j]['render'](name,data);
                                    }
                                    if(name){
                                        node += '<span>'+ title + name + '</span>';
                                    }
                                }
                                if(node){
                                    p += '<p title="'+key+value+'">'+ key + value + node +'</p>';
                                }
                            }else{
                                p += '<p title="'+key+value+'">'+ key + '<span>'+ value +'</span>' +'</p>';
                            }
                        }
                    }
                    $div_body.append(p);
                }
                $div_box.append($div_inner);
                $div_foot.append($pick_btn);
            }

            $parent_tr.after($tr);
        }
    }

    /**
     * 周边环境管理显示详情
     * @param tag           当前触发 JQ 对象 通常情况下为展开详情 i 按钮
     * @param dtTable       DataTable 对象
     * @param table         JQ 数据表格
     * @param template      详情模板对象
     * @param imgData       图片id和path构成的数组
     * 借鉴与显示详情方法，将有node的数据分为了p元素展示和div展示两种方式。多增加了图片的展示。
     */
    function showDivDetails(tag,dtTable,table,template,imgData,imgType,list){
        // 当前目标携带 id
        var id = tag.attr('data-id');
        // 是否存在已被填充 tr
        var $exist_tr = table.find('tr[data-id="'+id+'"]');
        // 隐藏其他行 tr i
        table.find('tr.zy-dy-tr').hide();
        table.find('i').removeClass('active');

        if($exist_tr.length > 0){
            tag.addClass('active');
            $exist_tr.show();
        }else{
            tag.addClass('active');
            // 父级数据行tr
            var $parent_tr = tag.parent('td').parent('tr');
            // 父级tr td数目
            var col = $parent_tr.find('td').length;
            // 当前行数据
            var data = {};
            if(list){
                data = list;
            }else{
                data = dtTable.row($parent_tr).data();
            }

            var $tr = $('<tr class="zy-dy-tr" data-id="'+ id +'"><td colspan="'+ col +'"><div class="zy-details-box"></div></td></tr>');
            var $div_box = $tr.find('div.zy-details-box');
            var $div_inner;
            if(imgData && imgData instanceof Array){
                if(imgType){
                    $div_inner = $('<div class="zy-dy-inner"><div class="zy-dy-p"></div><div class="xyf-dy-imgSmall"><span>照片：</span><div id="xyf-dy-' + id +'"></div></div><div class="zy-dy-footer"></div></div>');
                }else{
                    $div_inner = $('<div class="zy-dy-inner"><div class="zy-dy-p"></div><div class="xyf-dy-img"><span>照片：</span><div id="xyf-dy-' + id +'"></div></div><div class="zy-dy-footer"></div></div>');
                }
            }else{
                $div_inner = $('<div class="zy-dy-inner"><div class="zy-dy-p"></div><div class="zy-dy-footer"></div></div>');
            }
            var $div_body = $div_inner.find('div.zy-dy-p');
            var $div_img = $div_inner.find('div#xyf-dy-' + id);
            var $div_foot = $div_inner.find('div.zy-dy-footer');

            var p = '';
            for(var i=0,len=template.length; i<len; i++){
                if(data.hasOwnProperty(template[i]['name'])){
                    var key = template[i]['title'];
                    var value = data[template[i]['name']];
                    var isDiv = template[i]['isDiv'];
                    if(template[i]['render'] && template[i]['render'] instanceof Function){
                        value = template[i]['render'](value,data);
                    }
                    var node  = '';
                    if(template[i]['node'] && template[i]['node'] instanceof Array){
                        for(var j=0,nodeLen= template[i]['node'].length;j<nodeLen;j++){
                            var name = data[template[i]['node'][j]['name']];
                            var title = template[i]['node'][j]['title'];
                            if(template[i]['node'][j]['render'] && template[i]['node'][j]['render'] instanceof Function){
                                name = template[i]['node'][j]['render'](name,data);
                            }
                            if(name){
                                if(isDiv == 'false'){
                                    node +=  name;
                                }else {
                                    if (nodeLen == 1) {
                                        node += '<span title="' + title +  name + '">' + title + name + '</span>';
                                    } else if (nodeLen > 1) {
                                        if (j == 0) {
                                            node += '(<span title="' + title + name + '">' + title + name + '</span>&nbsp;&nbsp;&nbsp;&nbsp;';
                                        } else if (j == (nodeLen - 1)) {
                                            node += '<span title="' + title + name + '">' + title + name + '</span>)';
                                        } else {
                                            node += '<span title="' + title + name + '">' + title + name + '</span>&nbsp;&nbsp;&nbsp;&nbsp;';
                                        }

                                    }
                                }
                            }
                        }
                        if(node){
                            if(isDiv == 'false'){
                                p+= '<p>' +'<span title="'+ key + value + node + '">'  + key + value + node + '</span></p>';
                            }else{
                                p+= '<div>' + key + value + node + '</div>';
                            }
                        }
                    }else{
                        p += '<p>' + '<span title="'+ key + value +'">' + key +  value + '</span>' + '</p>';
                    }
                }
            }
            $div_body.append(p);

            //添加图片
            if(imgData && imgData instanceof Array){
                if(imgType){
                    $div_img.loadSmallImage(imgData);
                }else{
                    $div_img.loadAeImage(imgData);
                }
            }

            // 添加收起按钮
            var $pick_btn = $('<button type="button" class="zy-button zy-pick-up" data-id="'+ id +'"><i></i>收起</button>');
            $pick_btn.click(function(){
                var $this = $(this);
                var id = $this.attr('data-id');
                var $exist_tr = table.find('tr[data-id="'+id+'"]');
                if($exist_tr.length > 0){
                    tag.removeClass('active');
                    $exist_tr.hide();
                }
            });
            $div_foot.append($pick_btn);

            $div_box.append($div_inner);
            $parent_tr.after($tr);
        }
    }


    /**
     * 显示地图 - 应用于列表和地图显示切换 - 基础数据模块
     * @param tag           标记 list or map
     * @param jqTable       JQ 数据表格
     * @param iframe        地图 iframe 容器id
     * @param typeMode      地图 typeMode (模块类型)
     */
    function showMap(tag,jqTable,iframe,typeMode,which){
        var gisJsonArr = [];
        var $list_div = $('#JQ_toggle_list_div');
        var $map_div = $('#JQ_toggle_map_div');
        var $list_span = $('#JQ_toggle_list_span');
        var $map_span = $('#JQ_toggle_map_span');

        if(tag === 'list'){
            if(!($list_span.hasClass('active'))){
                // 触发收起查询
                $('div.xyf-toggle-form-div').trigger('pick');

                $list_span.addClass('active');
                $map_span.removeClass('active');
                $list_div.show();
                $map_div.height(0);
            }
        }else if(tag === 'map'){
            if(!($map_span.hasClass('active'))){
                // 触发收起查询
                $('div.xyf-toggle-form-div').trigger('pick');

                $list_span.removeClass('active');
                $map_span.addClass('active');
                $list_div.hide();

                // 设置地图iframe高度
                var $zy_map = $('div.zy-map');
                var $pick_div = $('div.zy-pick-line');
                var $tab_head = $('div.zy-cathodic-tab-head');
                if($zy_map.length > 0 && $pick_div.length > 0){
                    var w_h = $(window).height();
                    var p_h = $pick_div.height();
                    var h_h = w_h - p_h - 80;
                    if($tab_head.length > 0){
                        h_h = h_h - 200;
                    }
                    $map_div.height(h_h);
                }else{
                    $map_div.height(600);
                }

                // 组装gis参数
                var len = typeMode.length;
                if(len > 0){
                    for(var i = 0; i < len; i++){
                        var gis = {typeName:'',gisIdArray:[]}, gis_1 = {typeName:'',gisIdArray:[]}, gis_2 = {typeName:'',gisIdArray:[]};
                        var $input = jqTable.find('input[name="'+typeMode[i]['name']+'"]');
                        if ($input.length > 0) {
                            if(typeMode[i].hasOwnProperty('mode')){
                                if(typeMode[i]['mode'] == 'bow'){
                                    gis_1.typeName = 'elbow';
                                    gis_2.typeName = 'celbow';
                                }
                                if(typeMode[i]['mode'] == 'mark'){
                                    gis_1.typeName = 'mark';
                                    gis_2.typeName = 'warning';
                                }
                                if(typeMode[i]['mode'] == 'adjunct'){
                                    gis_1.typeName = 'adjunctPoint';
                                    gis_2.typeName = 'adjunctLine';
                                }
                            }else{
                                gis.typeName = typeMode[i]['type'];
                            }
                            $input.each(function(){
                                var $this = $(this);
                                var v = ($this.val() === '-' || $this.val() === '') ? '' : $this.val();
                                if(typeMode[i].hasOwnProperty('mode')){
                                    var mode = $this.attr('data-mode');
                                    if(mode == 0){
                                        if(v){
                                            gis_1.gisIdArray.push($this.val());
                                        }
                                    }
                                    if(mode == 1){
                                        if(v){
                                            gis_2.gisIdArray.push($this.val());
                                        }
                                    }
                                }else{
                                    if(v){
                                        var temp_arr = v.split('#');
                                        if(temp_arr.length > 1){
                                            for(var x = 0, lenths = temp_arr.length; x < lenths; x++){
                                                gis.gisIdArray.push(temp_arr[x]);
                                            }
                                        }else{
                                            gis.gisIdArray.push($this.val());
                                        }
                                    }
                                }
                            });
                            if(typeMode[i].hasOwnProperty('mode')){
                                gisJsonArr.push(gis_1);
                                gisJsonArr.push(gis_2);
                            }else{
                                gisJsonArr.push(gis);
                            }
                        }
                    }
                }

                console.log(gisJsonArr);

                var $iframe = $('#'+iframe);
                var src = $iframe.attr('data-src');
                if(which){
                    $iframe.get(0).onload = function(){
                        $iframe.get(0).contentWindow.self.queryMutiLayers(gisJsonArr);
                    };
                }else{
                    $iframe.get(0).onload = function(){
                        var tymode = function(){
                            var temp = '';
                            for(var i = 0, len = typeMode.length; i < len; i++){
                                temp = typeMode[i]['type'];
                            }
                            return temp;
                        }();
                        //console.log(tymode);
                        $iframe.get(0).contentWindow.self.typeMode = tymode;
                        $iframe.get(0).contentWindow.self.queryById(gisJsonArr);
                    };
                }
                $iframe.attr('src',src);
            }
        }
    }

    /**
     * 显示地图 - 用于iaas基础数据地图与列表切换
     * @param tag
     * @param url
     * @param iframe
     */
    function showMap2(tag, url, iframe, param, other) {
        var params = param || {};
        var gisJsonArr = {};
        var $list_div = $('#JQ_toggle_list_div');
        var $map_div = $('#JQ_toggle_map_div');
        var $list_span = $('#JQ_toggle_list_span');
        var $map_span = $('#JQ_toggle_map_span');

        if (tag === 'list') {
            if (!($list_span.hasClass('active'))) {
                // 触发收起查询
                $('div.xyf-toggle-form-div').trigger('pick');

                $list_span.addClass('active');
                $map_span.removeClass('active');
                $list_div.show();
                $map_div.height(0);
            }
        } else if (tag === 'map') {
            if (!($map_span.hasClass('active'))) {
                // 触发收起查询
                $('div.xyf-toggle-form-div').trigger('pick');

                $list_span.removeClass('active');
                $map_span.addClass('active');
                $list_div.hide();

                // 设置地图iframe高度
                var $zy_map = $('div.zy-map');
                var $pick_div = $('div.zy-pick-line');
                var $tab_head = $('div.zy-cathodic-tab-head');
                if ($zy_map.length > 0 && $pick_div.length > 0) {
                    var w_h = $(window).height();
                    var p_h = $pick_div.height();
                    var h_h = w_h - p_h - 80;
                    if ($tab_head.length > 0) {
                        h_h = h_h - 200;
                    }
                    $map_div.height(h_h);
                } else {
                    $map_div.height(600);
                }

                var $iframe = $('#' + iframe);
                var src = $iframe.attr('data-src');
                $iframe.attr('src', src);
                $iframe.get(0).onload = function () {
                    // 组装gis参数
                    DyyBase.ajax(url, params, function (dataset) {
                        if (dataset.bool) {
                            var data = $.parseJSON(dataset.result.data);
                            gisJsonArr.pipeInfo = data.pipeInfo;
                            gisJsonArr.valveRoom = data.valveRoom;
                        }
                    }, {async: false});

                    // 追加地面标识参数
                    if(other){
                        gisJsonArr[other.name] = other.fn();
                    }

                    $iframe.get(0).contentWindow.self.addMapElement(gisJsonArr.pipeInfo, gisJsonArr.valveRoom, other ? gisJsonArr[other.name] : undefined);
                };
            }
        }
    }

    /**
     * 周边环境管理地图
     * 将showMap拆分为两个方法，
     * 让页面不用刷线
     */
    function toggleListMap(tag){
        var $list_div = $('#JQ_toggle_list_div');
        var $map_div = $('#JQ_toggle_map_div');
        var $list_span = $('#JQ_toggle_list_span');
        var $map_span = $('#JQ_toggle_map_span');
        if(tag === 'list'){
            if(!($list_span.hasClass('active'))){
                $('div.xyf-list-search').show();  //查询表格
                $('div.xyf-map-search').hide();  //查询地图
                $('div.xyf-operate_div').show(); //左边的操作按钮，如新建/导出

                $list_span.addClass('active');
                $map_span.removeClass('active');
                $list_div.show();
                $map_div.height(0);
            }
        }else if(tag === 'map'){
            if(!($map_span.hasClass('active'))){
                $('div.xyf-list-search').hide();   //查询表格
                $('div.xyf-map-search').show();  //查询地图
                $('div.xyf-operate_div').hide();  //左边的操作按钮，如新建/导出

                $list_span.removeClass('active');
                $map_span.addClass('active');
                $list_div.hide();

                var $zy_map = $('div.zy-map');
                var $pick_div = $('div.zy-pick-line');
                var $tab_head = $('div.zy-cathodic-tab-head');
                if($zy_map.length > 0 && $pick_div.length > 0){
                    var w_h = $(window).height();
                    var p_h = $pick_div.height();
                    var h_h = w_h - p_h - 80;
                    if($tab_head.length > 0){
                        h_h = h_h - 200;
                    }
                    $map_div.height(h_h);
                }else{
                    $map_div.height(600);
                }
            }
        }
    }

    function aeMap(iframe,jsonArr,which){
        var $iframe = $('#'+iframe);
        var src = $iframe.attr('data-src');
        if(which){
            $iframe.get(0).onload = function(){
                $iframe.get(0).contentWindow.self.queryMutiLayers(jsonArr);
            };
        }else{
            $iframe.get(0).onload = function(){
                var tymode = function(){
                    var temp = '';
                    for(var i = 0, len = jsonArr.length; i < len; i++){
                        temp = jsonArr[i]['typeName'];
                    }
                    return temp;
                }();
                $iframe.get(0).contentWindow.self.typeMode = tymode;
                $iframe.get(0).contentWindow.self.queryById(jsonArr);
            };
        }
        $iframe.attr('src',src);
    }


    /**
     * 导入文件通用方法
     * @param options 参数
     * 注意 具体页面上需存在导入文件弹框
     */
    function importFile(options) {

        // 默认配置
        var defaults = {
            button: '',         // 触发导入按钮
            title: '',          // 弹框标题
            url: '',            // 导入提交地址
            input: '',          // 导入文件名只读输入框
            file: '',           // 导入文件域
            form: '',           // 导入提交表单
            iframe: '',         // 反馈信息iframe
            box: '',            // 弹框
            yes: '',            // 确认按钮
            no: '',             // 取消按钮
            param: ''           // 导入提交附加参数
        };

        var settings = $.extend({}, defaults, options);

        // 添加表单地址
        if(settings.url){
            settings.form.attr('action', settings.url);
        }

        // 清空文件名
        settings.input.val('');

        // 文件域事件
        settings.file.on('change', function () {
            settings.input.val($(this).val());
        });

        // 启动弹框
        settings.button.WIND({
            height: 240,
            width: 450,
            title: settings.title,
            actionBox: settings.box,
            yesBtn: settings.yes,
            noBtn: settings.no,
            yesBtnAct: function (clear) {

                // 是否超时
                if(!isLogin(null)){
                    return false;
                }

                // 是否有文件
                var v = settings.input.val();
                if(!v){
                    settings.input.TIP({
                        scroll: false,
                        content: '导入文件名不能为空!'
                    });
                    return false;
                }

                // 清除之前的参数
                settings.form.find('input[type="hidden"]').remove();

                // 追加参数
                if (settings.param) {
                    for (var k in settings.param) {
                        var $input = $('<input type="hidden">');
                        $input.prop('name', k).val(settings.param[k]);
                        settings.form.append($input);
                    }
                }

                // 提交
                settings.form.submit();

                // 获得反馈
                settings.iframe.get(0).onload = function () {
                    // 取消当前弹框
                    clear();
                    // 显示反馈
                    var current = settings.iframe.get(0).contentWindow;
                    var body = current.document.body.innerHTML;
                    if (body) {
                        try {
                            body = $.parseJSON(body);
                            if (body.bool) {
                                $(this).MSG({
                                    type: 'success',
                                    content: title + '成功!'
                                });
                            } else {
                                $(this).MSG({
                                    type: 'error',
                                    content: body.result
                                });
                            }
                        } catch (e) {
                            $(this).MSG({
                                type: 'error',
                                content: e.message
                            });
                        }
                    }
                };

            }
        });
    }


    /**
     * 下载模板文件通用方法
     * @param options
     * 注意 具体页面上需存在iframe和提交form
     */
    function downLoadTemplate(options) {

        var defaults = {
            url: '',
            iframe: $('#JQ_download_tpl_iframe'),
            form: $('#JQ_download_tpl_form')
        };

        var settings = $.extend({}, defaults, options);

        settings.iframe.get(0).onload = function () {
            var current = settings.iframe.get(0).contentWindow;
            var body = current.document.body.innerHTML;
            if (body) {
                try {
                    body = $.parseJSON(body);
                    if (body.bool) {
                        $(this).MSG({
                            type: 'success',
                            content: title + '成功!'
                        });
                    } else {
                        $(this).MSG({
                            type: 'error',
                            content: body.result
                        });
                    }
                } catch (e) {
                    $(this).MSG({
                        type: 'error',
                        content: e.message
                    });
                }
            }
        };

        settings.form.attr('action', settings.url);
        settings.form.submit();
    }


    /**
     * 通用 Ajax 方法 - 应用于整个管道完整性管理系统
     * @param url           请求地址 api 地址
     * @param data          要发送到服务端的数据
     * @param callback      回调函数
     * @param options       重载配置项
     * @returns {boolean}   返回值 (目前无返回)
     */
    function ajax(url, data, callback, options){

        // 地址无效
        if(url){
            if(typeof(url) != 'string'){
                showError('不是一个有效的请求地址！');
                return false;
            }
        }
        // 回调函数无效
        if(callback){
            if(typeof(callback) != 'function'){
                showError('不是一个有效的回调函数！');
                return false;
            }
        }
        // 参数无效
        if(options){
            if(typeof(options) != 'object'){
                showError('不是一个有效的配置对象！');
                return false;
            }
        }

        // 显示加载
        playLoading(true);

        var setting = options || {};
        var postdata = data || {};

        // 默认配置
        var defaults = {
            async: true,
            cache: false,
            data: postdata,
            dataType: 'text',
            headers: {DyyAjaxRequest: 'true'},
            type: 'POST',
            traditional : false
        };

        // 重写配置
        var settings = $.extend({}, defaults, setting);

        // 给url追加参数
        settings.url = function(){
            if(url.indexOf('?') !== -1){
                return url + '&AjaxMode=true&random=' + Math.random();
            }else{
                return url + '?AjaxMode=true&random=' + Math.random();
            }
        }();

        // 开始ajax
        $.ajax({
            async: settings.async,
            cache: settings.cache,
            dataType: settings.dataType,
            headers: settings.headers,
            type: settings.type,
            data: settings.data,
            url: settings.url,
            traditional : settings.traditional,
            complete: function(xhr, status, thrown){
                // 隐藏加载条
                playLoading(false);
            },
            error: function(xhr, status, thrown){
                // 隐藏加载条
                playLoading(false);
                try{
                    // 服务器返回错误
                    var response = $.parseJSON(xhr.responseText);
                    $(this).MSG({
                        type: 'error',
                        content: response.result
                    });
                }catch(e){
                    showError('网络连接超时，请稍后重试');
                    //showError('error: '+ e + ' code: ' + status + ' thrown: ' + thrown);
                    throw new Error(e.message);
                }
            },
            success: function(data){
                // 隐藏加载条
                playLoading(false);
                try{
                    var result = $.parseJSON(data);
                    if(result){
                        // session 过期
                        if(result.message && result.message === 'sessionStatusFalse'){
                            $(this).MSG({
                                type: 'error',
                                content: result.result,
                                yesBtnAct: goLogin,
                                closeBtnAct: goLogin
                            });
                            return false;
                        }
                        // 执行回调
                        if(typeof(callback) === 'function'){
                            callback(result);
                        }
                    }
                }catch(e){
                    //showError('error: '+ e);
                    throw new Error(e.message);
                }
            }
        });
    }


    /**
     * 判断用户是否登录超时
     * @returns {boolean}
     */
    function isLogin(callback){
        var mode = true;
        var url = base.root_path + '/comm/checkOutTime.json';
        base.ajax(url,{},function(dataset){
            if(dataset.bool){
                if(callback instanceof Function){
                    callback();
                }
            }else{
                mode = false;
            }
        },{async:false});
        return mode;
    }


    /**
     * 填充左侧菜单 - 并初始化
     * 如果本地存储有真数据则用之
     * 无则请求数据
     */
    if(base.mid){
        var menu_storage = Dyy.getStorage(base.mid), menu_json = $.parseJSON(menu_storage);
        if(menu_json){
            var node = menu_json.node;
            var $first = $('<ul id="JQ_first_menu" class="first-menu"></ul>');
            var idx = 1;
            for(var i in node){
                if(node[i].parentId == base.mid){
                    var f_url = (node[i].url).length > 0 ? base.root_path + node[i].url : '#';
                    var $fli = $('<li id="'+node[i].id+'"><a class="'+node[i].css+'" href="'+f_url+'"><i></i>'+node[i].name+'</a></li>');
                    $first.append($fli);
                    var $second = $('<ul class="second-menu"></ul>');
                    for(var j in node){
                        if(node[j].parentId == node[i].id){
                            var s_url = (node[j].url).length > 0 ? base.root_path + node[j].url : '#';
                            var $sli = $('<li id="'+node[j].id+'"><a href="'+s_url+'"><i></i>'+node[j].name+'</a></li>');
                            $second.append($sli);
                            var $third = $('<ul class="third-menu"></ul>');
                            for(var k in node){
                                if(node[k].parentId == node[j].id){
                                    var t_url = (node[k].url).length > 0 ? base.root_path + node[k].url : '#';
                                    var $tli = $('<li id="'+node[k].id+'"><a href="'+t_url+'"><i></i>'+node[k].name+'</a></li>');
                                    $third.append($tli);
                                }
                            }
                            if($third.children().length > 0){
                                $sli.append($third);
                            }
                        }
                    }
                    if($second.children().length > 0){
                        $fli.append($second);
                    }
                }
            }
            $('#JQ_sidebar_box').append($first);
        }else{
            // 请求菜单
            ajax(base.url_main_menu(),{menuMark:base.mid},function(dataset){
                // 得到菜单json数据
                var json = dataset.result;
                // 将菜单项存储到本地
                var menu_str = '';
                for(var a = 0, num = json.length; a < num; a++){
                    if(a == num - 1){
                        menu_str += '{"id":"'+json[a].id+'","parentId":"'+json[a].parentId+'","url":"'+json[a].url+'","name":"'+json[a].name+'","css":"'+json[a].css+'"}';
                    }else{
                        menu_str += '{"id":"'+json[a].id+'","parentId":"'+json[a].parentId+'","url":"'+json[a].url+'","name":"'+json[a].name+'","css":"'+json[a].css+'"},';
                    }
                }
                menu_str = '{"node":['+menu_str+']}';
                Dyy.setStorage(base.mid,menu_str);

                var $first = $('<ul id="JQ_first_menu" class="first-menu"></ul>');
                var idx = 1;
                for(var i in json){
                    if(json[i].parentId == base.mid){
                        var f_url = (json[i].url).length > 0 ? base.root_path + json[i].url : '#';
                        // 一级菜单
                        var $fli = $('<li id="'+json[i].id+'"><a class="'+json[i].css+'" href="'+f_url+'"><i></i>'+json[i].name+'</a></li>');
                        $first.append($fli);
                        var $second = $('<ul class="second-menu"></ul>');
                        for(var j in json){
                            if(json[j].parentId == json[i].id){
                                // 二级级菜单
                                var s_url = (json[j].url).length > 0 ? base.root_path + json[j].url : '#';
                                var $sli = $('<li id="'+json[j].id+'"><a href="'+s_url+'"><i></i>'+json[j].name+'</a></li>');
                                $second.append($sli);
                                var $third = $('<ul class="third-menu"></ul>');
                                for(var k in json){
                                    if(json[k].parentId == json[j].id){
                                        var t_url = (json[k].url).length > 0 ? base.root_path + json[k].url : '#';
                                        // 三级级菜单
                                        var $tli = $('<li id="'+json[k].id+'"><a href="'+t_url+'"><i></i>'+json[k].name+'</a></li>');
                                        $third.append($tli);
                                    }
                                }
                                if($third.children().length > 0){
                                    $sli.append($third);
                                }
                            }
                        }
                        if($second.children().length > 0){
                            $fli.append($second);
                        }
                    }
                }

                // 添加菜单
                $('#JQ_sidebar_box').append($first);
            },{async:false});
        }

        // 展开当前选中
        var temp_menu = $('#JQ_menu_active_arr').text();
        if(temp_menu != ','){
            var temp_arr = temp_menu.split(',');
            temp_arr.pop();
            for(var m = 0, len = temp_arr.length; m < len; m++){
                var strid = '#'+temp_arr[m];
                var $li = $(strid);
                if($li.length > 0){
                    $li.addClass('active');
                    $li.parents('.third-menu').show();
                    $li.parents('.second-menu').show();
                }
            }
        }

        // 左侧导航菜单展开效果
        $('#JQ_first_menu').delegate('li', 'mousedown', function (event) {
            var self = $(this);
            var sub_ul = self.children('ul');
            if(sub_ul.length != 0){
                self.siblings('li').removeClass('active');
                self.addClass('active');
                self.siblings('li').find('ul').hide('fast');
                sub_ul.stop().slideToggle('fast');
            }
            event.stopPropagation();
        });

        // 设置菜单滚动条 - 初始化滚动条插件
        if($('#JQ_sidebar_box').length > 0){
            $('#JQ_sidebar_box').mCustomScrollbar({
                theme: 'minimal'
            });
        }
    }


    /**
     * 填充管道数据
     */
    var $pipeline = $('#JQ_pipeline');
    if($pipeline.length > 0){
        var line_storage = Dyy.getStorage('lineData'), line_json = $.parseJSON(line_storage);
        if(line_json){
            var line = line_json.node;
            $pipeline.select3({
                data: line,
                title: '管道'
            });
        }else{
            ajax(base.url_piping(),{},function(dataset){
                var temp_data = getSelect(dataset);
                var temp_str = '';
                // 将管道数据写入本地存储
                if(temp_data.length > 0){
                    for(var i = 0, len = temp_data.length; i < len; i++){
                        if(i == len - 1){
                            temp_str += '{"id":"'+ temp_data[i].id +'","text":"'+temp_data[i].text+'","mile":"'+temp_data[i].mile+'"}';
                        }else{
                            temp_str += '{"id":"'+ temp_data[i].id +'","text":"'+temp_data[i].text+'","mile":"'+temp_data[i].mile+'"},';
                        }
                    }
                }
                temp_str = '{"node":['+ temp_str +']}';
                Dyy.setStorage('lineData',temp_str);
                $pipeline.select3({
                    data: temp_data,
                    title: '管道'
                });
            },{async: false});
        }
    }


    // 导出公共方法
    base.getImagePath = getImagePath;
    base.currentData = currentData;
    base.getSelectData = getSelectData;
    base.getSelect = getSelect;
    base.getPos = getPos;
    base.getNewPos = getNewPos;
    base.needArr = needArr;
    base.existJson = existJson;
    base.showError = showError;
    base.existResponse = existResponse;
    base.pageReload = pageReload;
    base.ajax = ajax;
    base.playLoading = playLoading;
    base.clearNaN = clearNaN;
    base.clearNull = clearNull;
    base.clearSpace = clearSpace;
    base.goBackPage = goBackPage;
    base.goToPage = goToPage;
    base.convertToArr = convertToArr;
    base.showDetails = showDetails;
    base.showDivDetails = showDivDetails;
    base.showMap = showMap;
    base.toggleListMap = toggleListMap;
    base.aeMap = aeMap;
    base.setChartWidth = setChartWidth;
    base.deleteArray = deleteArray;
    base.notEmpty = notEmpty;
    base.getMinMax = getMinMax;
    base.getPercent = getPercent;
    base.goLogin = goLogin;
    base.isLogin = isLogin;
    base.unicodeUrl = unicodeUrl;
    base.importFile = importFile;
    base.downLoadTemplate = downLoadTemplate;
    base.showMap2 = showMap2;

    return base;
}();